home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / envtools / envreduce.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  3.7 KB  |  191 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    envreduce -
  19.  *        Reduce an environment map by a factor of 2.
  20.  *
  21.  *                Paul Haeberli - 1987
  22.  */
  23. #include "texture.h"
  24.  
  25. TEXTURE *tm;
  26. int doreflect;
  27. int xsize, ysize;
  28.  
  29. float kernel[4][4] = {
  30.         1,    2,    2,    1,    
  31.         2,    4,    4,    2,    
  32.         2,    4,    4,    2,    
  33.         1,    2,    2,    1,    
  34. };
  35.  
  36. main(argc,argv)
  37. int argc;
  38. char **argv;
  39. {
  40.     float tr, tg, tb;
  41.     int x, y, dx, dy;
  42.     IMAGE *image;
  43.     int dir, i;
  44.     vect pos, v, vv, c;
  45.     float delta, w;
  46.     short *rbuf, *gbuf, *bbuf;
  47.  
  48.     if(argc<3) {
  49.     fprintf(stderr,"usage: envreduce in.env out.env\n"); 
  50.     exit(1);
  51.     }
  52.     tm = tmopen(argv[1]);
  53.     if(!tm) {
  54.     printf("can't open environment map.\n");
  55.     exit(1);
  56.     }
  57.     xsize = tm->xsize;
  58.     ysize = tm->ysize;
  59.     if(xsize&1 || ysize&1) {
  60.     printf("envreduce: bad poop\n");
  61.     exit(1);
  62.     }
  63.     delta = 1.0/(xsize/2);
  64.     xsize = xsize/2;
  65.     ysize = ysize/2;
  66.     rbuf = (short *)malloc(xsize*sizeof(short));
  67.     gbuf = (short *)malloc(xsize*sizeof(short));
  68.     bbuf = (short *)malloc(xsize*sizeof(short));
  69.     image = iopen(argv[2],"w",RLE(1),3,xsize,ysize,3);
  70.     for(y=0; y<ysize; y++) {
  71.     for(x=0; x<xsize; x++) {
  72.         pos.x = (x+0.5)/xsize;
  73.         pos.y = (y+0.5)/ysize;
  74.         pos.z = 0.0;
  75.         dir = envtodir(&pos,&v);
  76.         switch(dir) {
  77.         case 1:
  78.             v.y -= 1.5*delta;
  79.             v.z -= 1.5*delta;
  80.             break;
  81.         case 2:
  82.             v.x -= 1.5*delta;
  83.             v.z -= 1.5*delta;
  84.             break;
  85.         case 3:
  86.             v.x -= 1.5*delta;
  87.             v.y -= 1.5*delta;
  88.             break;
  89.         }
  90.         tr = tg = tb = 0.0;
  91.         for(dy=0; dy<4; dy++) {
  92.         for(dx=0; dx<4; dx++) {
  93.             switch(dir) {
  94.             case 1:
  95.                 vv.x = v.x;
  96.                 vv.y = v.y+delta*dx;
  97.                 vv.z = v.z+delta*dy;
  98.                 break;
  99.             case 2:
  100.                 vv.y = v.y;
  101.                 vv.x = v.x+delta*dx;
  102.                 vv.z = v.z+delta*dy;
  103.                 break;
  104.             case 3:
  105.                 vv.z = v.z;
  106.                 vv.x = v.x+delta*dx;
  107.                 vv.y = v.y+delta*dy;
  108.                 break;
  109.             }
  110.             envsample(tm,&vv,&c);
  111.             w = kernel[dy][dx];
  112.             tr += w*c.x;
  113.             tg += w*c.y;
  114.             tb += w*c.z;
  115.         }
  116.         }
  117.         rbuf[x] = 255*tr/36;
  118.         gbuf[x] = 255*tg/36;
  119.         bbuf[x] = 255*tb/36;
  120.     }
  121.     putrow(image,rbuf,y,0);
  122.     putrow(image,gbuf,y,1);
  123.     putrow(image,bbuf,y,2);
  124.     tpercentdone(100.0*y/(ysize-1));
  125.     }
  126.     iclose(image);
  127. }
  128.  
  129. envtodir(e,v)
  130. vect *e, *v;
  131. {
  132.     int seg;
  133.     float tx, ty;
  134.  
  135.     tx = 3.0*e->x;
  136.     ty = 2.0*e->y;
  137.     seg = 0;
  138.     if(ty>1.0) {
  139.     seg = 3;
  140.     ty -= 1.0;
  141.     } else
  142.     seg = 0;
  143.     if(tx>2.0) {
  144.     seg += 2;
  145.     tx -= 2.0;
  146.     } else if(tx>1.0) {
  147.     seg += 1;
  148.     tx -= 1.0;
  149.     }
  150.     tx -= 0.5;
  151.     ty -= 0.5;
  152.     switch(seg) {
  153.     case 0:
  154.         v->x = -0.5;
  155.         v->y = tx;
  156.         v->z = ty;
  157.         return 1;
  158.         break;
  159.     case 1:
  160.         v->y = -0.5;
  161.         v->z = tx;
  162.         v->x = ty;
  163.         return 2;
  164.         break;
  165.     case 2:
  166.         v->z = -0.5;
  167.         v->x = tx;
  168.         v->y = ty;
  169.         return 3;
  170.         break;
  171.     case 3:
  172.         v->x = 0.5;
  173.         v->y = tx;
  174.         v->z = ty;
  175.         return 1;
  176.         break;
  177.     case 4:
  178.         v->y = 0.5;
  179.         v->z = tx;
  180.         v->x = ty;
  181.         return 2;
  182.         break;
  183.     case 5:
  184.         v->z = 0.5;
  185.         v->x = tx;
  186.         v->y = ty;
  187.         return 3;
  188.         break;
  189.     }
  190. }
  191.